iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1
AI & Data

AI Voice Conversion系列 第 4

【Day4】音樂分類小實驗

  • 分享至 

  • xImage
  •  

資料集

在這個實驗裡我們用的原始資料集在這裡下載

或是直接從這裡下載 csv 跟 notebook 就好

這個資料集名稱叫做 GTZAN ,裏頭一共有 10 種類型的音樂,每種類型有 100 首歌曲,每首歌曲都是 30 秒鐘

這 10 種音樂類型為:
0: "disco",
1: "metal",
2: "reggae",
3: "blues",
4: "rock",
5: "classical",
6: "jazz",
7: "hiphop",
8: "country",
9: "pop"

除此之外,他很好心的幫我們把 features 萃取出來了,你還會額外有兩個 csv 檔,分別是 features_3_sec 跟 features_30_sec

/images/emoticon/emoticon07.gif

features_3_sec 把一首 30 秒的歌切成 10 個音框,每個音框 3 秒,然後計算每 3 秒的 features,所以他的features 數是原本的 10 倍

開始工作

我們就用它提供給的 csv 檔來做即可

import pandas as pd 
import numpy as np
from sklearn.preprocessing import LabelEncoder
data = pd.read_csv("features_3_sec.csv")
data.head()

# (9990,60)
data.shape

# 移除有檔名的那欄
data = data.drop(labels='filename',axis=1)
# 最後一欄是類別 (str)
class_list = data.iloc[:,-1] 
# 用 LabelEncoder 幫我們把類別編碼
convert = LabelEncoder()
y = convert.fit_transform(class_list)
y

x = data.iloc[:,:-1]
x

接著我們要把餵進去的 feature data 常態分布化,這樣平均值會變成 0, 標準差變為 1,使離群值影響降低

from sklearn.preprocessing import StandardScaler
fit = StandardScaler()
X = fit.fit_transform(np.array(x,dtype=float))

再切分成 train, valid 兩份 data

from sklearn.model_selection import train_test_split
X_train,x_test, Y_train, y_test = train_test_split(X,y,test_size=0.2)
print(len(Y_train),len(y_test))

開始 build 我們的模型吧,單純用 FCN 就好了

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential(
    [

        Dense(512,input_shape=(X_train.shape[1],),activation='relu'),
        Dense(256,activation='relu'),
        Dense(128,activation='relu'),
        Dense(64,activation='relu'),
        Dense(10,activation='softmax')
    ]
)

model.summary()
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics='accuracy')
    

開 Train

history = model.fit(
                X_train,
                Y_train, 
                validation_data=(x_test,y_test), 
                epochs=600, 
                batch_size=128
                )
                

到這裡差不多 test data 就有 9 成的準確率了,我們來看一下 loss 長怎樣

from matplotlib import pyplot 
pyplot.plot(history.history['loss'], label='train') 
pyplot.plot(history.history['val_loss'], label='test') 
pyplot.legend()
pyplot.show()

小結

其實你會發現比較惱人的部分是在萃取資料的 feature,以這個資料集來說一段音樂用了 60 個 feature,如果想要試在其他音樂上的話就必須生出那 60 個 feature。當然也可以試著用比較少的 feature 來做,但效果在這個 model 上就會開始變差,或是要訓練的更久才能一樣好。總而言之,我們確實證明了聲音的 feature 是可以讓機器來區別音樂種類的。

參考資料

Kaggle GTZAN Dataset

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


上一篇
【Day3】聲音的特徵提取
下一篇
【Day5】從頻域到 wave 的轉換,淺談虛數可以拿來 Train Model 嗎?
系列文
AI Voice Conversion30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言